//
//  NSString+YYUtil.h
//
//  Created by Galaxy Hold on 2020/8/10.
//  Copyright © 2020 Galaxy Hold. All rights reserved.
//

#import <UIKit/UIKit.h>

//数字
#define NUM_FBX       @"0123456789"
//字母
#define ALPHA_FBX     @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
//数字和字母
#define ALPHANUM_FBX  @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#define EmojiCodeToSymoblFBX(c) ((((0x808080F0 | (c & 0x3F000) >> 4) | (c & 0xFC0) << 10) | (c & 0x1C0000) << 18) | (c & 0x3F) << 24)


@interface NSString (YYUtil)

/// 生成随机字符串
+(NSString *)generateRandomLetter:(int)length;
//Base64解码
+ (NSString *)base64Decode:(NSString *)str;
//判断是否由中文、字母或数字组成
+ (BOOL)isInputRuleAndBlank:(NSString*)charStr;
//判断是否是纯汉字
+ (BOOL)isChineseWithStr:(NSString*)charStr;

//判断是否含有汉字
+ (BOOL)includeChineseWithStr:(NSString*)charStr;

//判断字符串中包含数字和字母的几种情况==
+(int)checkIsHaveNumAndLetter:(NSString*)charStr;

//判断手机号码，1开头的十一位数字
+ (BOOL)CheckMobileInput:(NSString *)text;

//验证手机号码
+(BOOL)validateMobile:(NSString *)mobileNum;

//验证固话
+(BOOL)isFixedTelephone:(NSString *)phoneNum;

//验证 固话+移动电话
+ (BOOL)isTelephoneOrMobilePhone:(NSString *)phoneNum;

//利用正则表达式验证邮箱
+(BOOL)isValidateEmail:(NSString *)email;

//校验密码格式
+(BOOL)isValidatePassword:(NSString *)password;

///密码校验,8到16位  必须包含大小写字母,数字
+(BOOL)validatePassword:(NSString*)password;

///验证码检验 6位数字
+(BOOL)validateVerificationCode:(NSString*)code;

/// 用户名校验
+(BOOL)validateUserName:(NSString*)userName;

///mac地址校验
+(BOOL)validateMacAddress:(NSString*)macAddr;

//车牌号验证
+ (BOOL) checkCarNumber:(NSString *)CarNumber;

//校验空对象
+ (NSString *)checkNull:(id)obj defaultValue:(NSString *)value;

//去除数字和字母以外的所有字符, 再计算字符长度
+ (NSUInteger)fbxCalculateCharacterLength:(NSString *)mStr;


//去除数字和字母以外的所有字符
+ (NSString *)removalSpecialCharacters:(NSString *)charStr;

//URLEncode
+ (NSString*)fbxEncodeString:(NSString*)unencodedStr;

//判断字符串中是否有空格
+ (BOOL)fbxIsBlank:(NSString*)str;


//返回带*星号的手机号码
+ (NSString *)fbxStarPhoneNumerFromNumerStr:(NSString *)numerStr;
// 返回带星号的名称
+ (NSString *)fbxStarNameFromNumerStr:(NSString *)numerStr;
/**
 数字单位转换 万/百万/千万/亿，保留小数点后2位数
 @param string  阿拉伯数字
 @param defStr  数字为0时，返回的默认字符
 @return 汉语数字
 */
+ (NSString *)getYYDealNumWithStr:(NSString *)string
                    zeroNumDefStr:(NSString *)defStr;

/**
 数字单位转换 万/亿，保留小数点后4位数
 @param string  阿拉伯数字
 @param defStr  数字为0时，返回的默认字符
 @return 汉语数字
 */
+ (NSString *)YYDealAllNumStr:(NSString *)string
                zeroNumDefStr:(NSString *)defStr;

/**
 阿拉伯数字转化为汉语数字
 @param arebic  阿拉伯数字
 @param defStr  数字为0时，返回的默认字符
 @return 汉语数字
 */
+ (NSString *)getYYNumwTranslation:(NSString *)arebic
                     zeroNumDefStr:(NSString *)defStr;

/**
 obj是否包含有某str
 如果obj不包含某str，拼接某str
 */
+ (NSString *)rangeOfObj:(NSString *)obj
              containStr:(NSString *)str;

/**
 *  判断传入的字符串是否符合HTTP路径的语法规则,即”HTTPS://” 或 “HTTP://”
 */
+ (NSURL *)smartURLForString:(NSString *)str;


//当前时间戳 加减； 返回的是时间戳
+ (NSInteger)getPastHafHourTime:(double)timeValue;

//时间戳 转 标准时间, 自定义时间格式；
+ (NSString*)turnTimeWithTimestamp:(NSInteger)turnTime
                     formatterType:(NSString *)forType;

//时间转时间戳，自定义时间格式； 返回的是时间戳 （NSInteger类型）
+ (NSInteger)crazyTimeToTimestamp:(NSString *)dataStr
                    formatterType:(NSString *)forType;

//获取一个随机数字符串，范围在[from,to]，包括from，包括to
+ (NSString *)getYYRandomNumber:(NSInteger)fromValue
                             to:(NSInteger)toValue;

+ (NSString *)YYSafeTimestampWithDate:(NSDate*)date;
//根据长度 获取一个随机数字符串
+ (NSString *)YYSafeRandomStringWithLength:(NSInteger)length;
+ (NSString *)YYSignCodeWithUid:(NSString *)uid
                         random:(NSString *)random
                      phoneName:(NSString *)phoneName
                      phoneUUID:(NSString *)phoneUUID
                        systemV:(NSString *)systemV
                            ver:(NSString *)ver
                      timestamp:(NSString *)time;

//时间显示内容 (maxDateFormat 默认 MM/dd)
+ (NSString *)YYTimeFromTimestamp:(NSInteger)timestamp
                    maxDateFormat:(NSString *)maxDateFormat;

//获取时间：显示今天或昨天
+ (NSString *)YYGetYMDFromTimestamp:(NSInteger)timestamp
                      maxDateFormat:(NSString *)maxDateFormat;

/**
 *  显示时间（几分钟前，几小时前，几天前）
 */
+ (NSString *)YYCompareCurrentTime:(NSInteger)timestamp;

- (BOOL)isOnlyAlphaAndNumeric;

//获取随机的UUID
+ (NSString *)getYYRandomUUID;

/**
 数字单位转换 万/百万/千万/亿 元
 @param string  阿拉伯数字
 @param defStr  数字为0时，返回的默认字符
 @return 汉语数字
 */
+ (NSString *)getYYDealAmountWithStr:(NSString *)string
                       zeroNumDefStr:(NSString *)defStr;



//==========================================================================//

//返回整数的字符串
+ (NSString*)fbxReturnIntNum:(NSString*)stringNumber;

//double值为xx.00时，不显示小数点及后两位
+ (NSString *)fbxReturnNumStr:(double)num;

/**
 *  去除小数点.
 *  @param stringNumber   原始的字符串
 *  complete回调   NoDecimalPointStr: 无小数点字符串; errcode: KSuccessCode 无小数点，KErrorCode1102 有小数点
 */
+ (void)fbxReDecimalPoint:(NSString*)stringNumber
               atComplete:(void(^)(NSString *NoDecimalPointStr, NSInteger errcode))complete;

//保留小数点后两位，strIndex大于0，整数值截取到strIndex
+ (NSString*)fbxReturnFormatter:(NSString *)strNum
                  subStrToIndex:(NSUInteger)strIndex;

//金额千位分显示, 比如：￥123,456,789.00
+ (NSString *)fbxAmountThousandBitsWithNumber:(NSNumber *)numb;

//金额 高精度保留两位小数, 比如：￥123,456,789.00
+ (NSString *)formatStringAfterPoint:(NSString *)amtStr;

//金额 高精度保留两位小数,(无分隔符) 比如：￥123456789.34  ￥123456789
//https://cloud.tencent.com/developer/article/1336392
+ (NSString *)stringAfterPoint:(NSString *)amtStr;

//金额 高精度保留两位小数,(无分隔符) 比如：￥123456789.34
+ (NSString *)stringTwoPoint:(NSString *)amtStr;



/**
 *  获取当前时间
 *  @param dateFormatStr  时间格式    例如：@"yyyy年MM月dd日"
 *  return dateTime  当前时间
 */
+ (NSString *)getCurrentDateWithDateFormatStr:(NSString *)dateFormatStr;

//获得当前时间的前几天，几个月，几年
+ (NSString *)currentDateFormat:(NSString *)format
                          years:(NSInteger)years
                         months:(NSInteger)months
                           days:(NSInteger)days;


//MARK: 时间转时间戳，自定义时间格式； 返回的是时间戳 （NSInteger类型）
+(NSInteger)YYCrazy_timeToTimestamp:(NSString *)dataStr
                      formatterType:(NSString *)formatterType;


//==========================================================================//


- (NSRange)rangeByTrimmingLeftCharactersInSet:(NSCharacterSet *)characterSet;
- (NSRange)rangeByTrimmingRightCharactersInSet:(NSCharacterSet *)characterSet;

- (NSString *)trimWhitespace;
- (BOOL)isEmpty;
- (BOOL)isEmptyOrListening;
//判断是否为整形
- (BOOL)isPureInt;
//判断是否为浮点形
- (BOOL)isPureFloat;
//是否相等
- (BOOL)calculateIsEqual:(NSString *)stringNumer;
//是否大于
- (BOOL)calculateIsGreaterThan:(NSString *)stringNumer;
//是否小于
- (BOOL)calculateIsLessThan:(NSString *)stringNumer;

+(BOOL)hasChinese:(NSString *)str;
/**
 计算文字高度，允许换行计算

 @param font  字体
 @param width 文字宽度
 @param minLineHeight 最小行高
 @return 返回文字的高度
 */
- (CGFloat)YYSizeLineFeedWithFont:(UIFont *)font
                        textWidth:(CGFloat)width
                    minLineHeight:(CGFloat)minLineHeight;



/// --json字符串转字典
- (NSDictionary *)jsonStringToDictionary;
/// --json字符串转数组
- (NSArray *)jsonStringToArray;

///富文本
+(NSAttributedString*)attributeStringWithContent:(NSString*)content  attriFont:(UIFont*)font attriColor:(UIColor*)color attriKey:(NSString*)key;

///检查是否全是空字符
+(BOOL)checkIsAllEmptyLater:(NSString*)content;

///参数设置加减项只允许输入正负整数或小数
+(BOOL)checkIsIntOrDecimalNumber:(NSRange)range textFieldContent:(NSString*)textFieldString inputString:(NSString*)string;
@end


